<?php

namespace Respect\Validation\Rules;

use ReflectionClass;
use Respect\Validation\Exceptions\ComponentException;

class Zend extends AbstractRule
{

    protected $messages = array();
    protected $zendValidator;

    public function __construct($validator, $params=array())
    {
        if (is_object($validator))
            return $this->zendValidator = $validator;

        if (!is_string($validator))
            throw new ComponentException('Invalid Validator Construct');

        if (false === stripos($validator, 'Zend'))
            $validator = "Zend\Validator\\{$validator}";
        else
            $validator = "\\{$validator}";

        $zendMirror = new ReflectionClass($validator);

        if ($zendMirror->hasMethod('__construct'))
            $this->zendValidator = $zendMirror->newInstanceArgs($params);
        else
            $this->zendValidator = $zendMirror->newInstance();
    }

    public function assert($input)
    {
        $exceptions = array();
        $validator = clone $this->zendValidator;

        if ($validator->isValid($input))
            return true;
        else
            foreach ($validator->getMessages() as $m)
                $exceptions[] = $this->reportError($m, get_object_vars($this));

        throw $this->reportError($input)->setRelated($exceptions);
    }

    public function validate($input)
    {
        $validator = clone $this->zendValidator;
        return $validator->isValid($input);
    }

}

